﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanCafe_DAO_WS;

namespace QuanCafe
{
    public class HoaDonThanhToanDAO : DataProvider
    {

        // viết hàm xem danh sách hóa đơn
        public List<HoaDonThanhToanDTO> HD_LayDanhSachHoaDon()
        {
            try
            {
                // tạo biến datacontext
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách các hóa đơn hiện có
                var HoaDons = data.HoaDonThanhToans.OrderBy(temp => temp.mahoadon);
                // tạo biến trả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                // duyệt
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;    
            }
            catch
            {
                return null;
            }
        }

        // viết hàm upload hóa đơn
        public bool HD_UpHoaDonThanhToan(string ngaylap, float tongtien)
        {
            try
            {
                // tạo 1 biến datacontext
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // tạo mã hóa đơn
                string mahoadon = HD_TaoMaHoaDon();
                // kiểm tra
                if (HD_DaTonTaiHoaDon(mahoadon) == false) // chưa có
                {
                    HoaDonThanhToan hd = new HoaDonThanhToan();
                    hd.mahoadon = mahoadon;
                    hd.ngaylap = ngaylap;
                    hd.tongtien = tongtien;
                    data.HoaDonThanhToans.InsertOnSubmit(hd);
                    data.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }


        // viết hàm tạo mã hóa đơn
        private string HD_TaoMaHoaDon()
        {
            Random r = new Random();
            char[] c;
            string s = "";
            c = new char[10];
            string chuoikytu = "ASDFGHJKLQWERTYUIOPZXCVBNM1234567890";
            if (DateTime.Now.Hour < 12)
            {
                s = "SA" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();

            }
            else
            {
                s = "CH" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
            }

            for (int i = 0; i < 10; i++)
            {
                c[i] = chuoikytu[r.Next(chuoikytu.Length)];
                s += c[i].ToString();
            }
            return s;
        }


        // viết hàm kiểm tra mã hóa đơn có tồn tại ko
        public bool HD_DaTonTaiHoaDon(string mahoadon)
        {
            try
            {
                // tạo 1 biến 
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();

                // lấy ra danh sách các hóa đơn
                var hoaDons = data.HoaDonThanhToans.Where(temp => true);
                // kiểm tra
                if (hoaDons.Any(temp => temp.mahoadon == mahoadon))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }

        }

        // viết hàm xóa một hóa đơn
        public bool HD_XoaMotHoaDon(string mahoadon)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // kiểm tra hóa đơn
                if (HD_DaTonTaiHoaDon(mahoadon) == true)
                {
                    // lấy ra hóa đơn
                    HoaDonThanhToan hd = data.HoaDonThanhToans.Single(temp => temp.mahoadon == mahoadon);
                    // xóa 
                    data.HoaDonThanhToans.DeleteOnSubmit(hd);
                    data.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
            
        }




        // viết hàm đọc hóa đơn
        private object GetDataFromDataConText(HoaDonThanhToan hd)
        {
            HoaDonThanhToanDTO hoadon = new HoaDonThanhToanDTO();
            hoadon.Mahoadon = hd.mahoadon;
            hoadon.Ngaylap = hd.ngaylap;
            hoadon.Tongtien = (float)hd.tongtien;

            return (object)hoadon;
        }

        #region Các hàm liên quan đến truy vấn

        // viết hàm tra cứu hóa đơn theo mã
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoMa(string mahoadon)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.mahoadon.StartsWith(mahoadon) == true);
                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }

        }

        // viết hàm tra cứu hóa đơn theo ngày
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoNgayLap(string ngaylap)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                if (DateTime.Now.Month.ToString().Length == 1)
                {
                    ngaylap += "/0" + DateTime.Now.Month.ToString() + "/" + DateTime.Now.Year.ToString();
                }
                else
                {
                    ngaylap += "/" + DateTime.Now.Month.ToString() + "/" + DateTime.Now.Year.ToString();
                }
                
                
                // lấy ra danh sách các hóa đơn theo ngày
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap == ngaylap);
                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }
        }

        // viết hàm tra cứu hóa đơn theo tháng
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoThang(string thang)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                thang += "/" + DateTime.Now.Year.ToString();
                // lấy ra danh sách
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap == thang);
                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }
        }

        // viết hàm tra cứu hóa đơn theo năm
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoNam(string nam)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(6, 4).StartsWith(nam) == true);
                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }
        }

        // viết hàm tra cứu hóa đơn theo ngày/tháng/năm
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoThoiGian(string thoigian)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();

                var HoaDons = data.HoaDonThanhToans.Where(temp => true);
                // lấy ra danh sách các hóa đơn theo thời gian
                if (thoigian.Length == 10)
                {
                    HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.StartsWith(thoigian) == true);
                }
                else // chỉ có tháng và năm
                {
                    HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(3, 7).StartsWith(thoigian) == true);
                }

                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }
        }

        // viết hàm tra cứu hóa đơn theo tổng tiền
        public List<HoaDonThanhToanDTO> HD_TraHoaDonTheoTongTien(float tongtien)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.tongtien ==  tongtien);
                // trả kết quả về
                List<HoaDonThanhToanDTO> hoaDonThanhToans = new List<HoaDonThanhToanDTO>();
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    object obj = GetDataFromDataConText(hd);
                    hoaDonThanhToans.Add((HoaDonThanhToanDTO)obj);
                }
                return hoaDonThanhToans;
            }
            catch
            {
                return null;
            }
        }

        #endregion

        #region Tính Doanh Thu

        // viết hàm tính tổng doanh thu trong ngày
        public double HD_TinhDoanhThuTheoNgay(string ngay)
        {
            // tạo 1 biến để tính tổng doanh thu
            double _doanhthu = 0;
            
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách các hóa đơn theo ngày
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap == ngay);
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    _doanhthu += (double)hd.tongtien;
                }
                return _doanhthu;
            }
            catch
            {
                return _doanhthu;
            }
        }

        // viết hàm tính doanh thu theo tháng
        public double HD_TinhDoanhThuTheoThang(string thang)
        {
            // tạo 1 biến để tính tổng doanh thu
            double _doanhthu = 0;
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách các hóa đơn theo tháng
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(3,7).StartsWith(thang) == true);
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    _doanhthu += (double)hd.tongtien;
                }
                return _doanhthu;
            }
            catch
            {
                return _doanhthu;
            }
        }

        // viết hàm tính tổng doanh thu theo năm
        public double HD_TinhDoanhThuTheoNam(string nam)
        {
            // tạo 1 biến để tính tổng doanh thu
            double _doanhthu = 0;
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách các hóa đơn theo tháng
                var HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(6, 4).StartsWith(nam) == true);
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    _doanhthu += (double)hd.tongtien;
                }
                return _doanhthu;
            }
            catch
            {
                return _doanhthu;
            }
        }

        // viết hàm tính tổng doanh thu theo thời gian cụ thể
        public double HD_TinhDoanhThuTheoThoiGian(string thoigian)
        {
            // tạo 1 biến để tính tổng doanh thu
            double _doanhthu = 0;
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();

                var HoaDons = data.HoaDonThanhToans.Where(temp => true);
                // lấy ra danh sách các hóa đơn theo thời gian
                if (thoigian.Length == 10) // dd/mm/yyyy
                {
                    HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.StartsWith(thoigian) == true);
                }
                else
                {
                    if (thoigian.Length == 7)  // mm/yyyy
                    {
                        HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(3).StartsWith(thoigian) == true);
                    }
                    else // yyyy
                    {
                        HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(6).StartsWith(thoigian) == true);
                    }
                }
                foreach (HoaDonThanhToan hd in HoaDons)
                {
                    _doanhthu += (double)hd.tongtien;
                }
                return _doanhthu;
            }
            catch
            {
                return _doanhthu;
            }
        }


        // viết hàm tính tổng số hóa đơn
        public float HD_LayTongSoHoaDon(string thoigian)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra toàn bộ hóa đơn
                var HoaDons = data.HoaDonThanhToans.Where(temp => true);

                // lấy ra danh sách các hóa đơn theo thời gian
                if (thoigian.Length == 10) // dd/mm/yyyy
                {
                    HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.StartsWith(thoigian) == true);
                }
                else
                {
                    if (thoigian.Length == 7)  // mm/yyyy
                    {
                        HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(3).StartsWith(thoigian) == true);
                    }
                    else // yyyy
                    {
                        HoaDons = data.HoaDonThanhToans.Where(temp => temp.ngaylap.Substring(6).StartsWith(thoigian) == true);
                    }
                }
                // lấy số lượng trả về
                return HoaDons.Count();
            }
            catch
            {
                return -1;
            }

        }

        #endregion

    }
}
